package com.woniu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.woniu.exception.RebornException;
import com.woniu.mapper.FlowHandleMapper;
import com.woniu.mapper.FlowModeMapper;
import com.woniu.model.FlowHandle;
import com.woniu.model.FlowMode;
import com.woniu.service.FlowHandleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.service.param.AddHandelParam;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author 吴彦祖
 * @since 2024年05月23日
 */
@Service
@Transactional
public class FlowHandleServiceImpl extends ServiceImpl<FlowHandleMapper, FlowHandle> implements FlowHandleService {

    @Resource
    private FlowHandleMapper flowHandleMapper;
    @Resource
    private FlowModeMapper flowModeMapper;

    /**
     * 查询一个订单当前走到哪一步了
     *
     * @param orderNum 订单号
     */
    @Override
    public FlowHandle findNow(String orderNum) {
        QueryWrapper<FlowHandle> now = new QueryWrapper<FlowHandle>().eq("now", 1).eq("order_id", orderNum);
        FlowHandle flowHandle = null;
        try {
            flowHandle = flowHandleMapper.selectOne(now);
        } catch (Exception e) {
            throw new RebornException("查询结果为空",50001);
        }
        return flowHandle;
    }


    /**
     * 创建流程执行
     *
     * @param param 添加流程执行的参数
     * @return 新创建的流程执行对象
     */
    @Override
    public FlowHandle add(AddHandelParam param) {
        // 创建一个新的流程执行对象
        FlowHandle newHandle = new FlowHandle();

        // 检查流程模板ID是否存在，来判断是新流程还是继续已有流程
        if (param.getFlowModeId() != null) {
            // 传了流程模板ID，证明是第一次生成
            newHandle.setFlowModeId(param.getFlowModeId());

            // 根据流程模板ID查询对应的流程模板
            FlowMode flowMode = flowModeMapper.selectById(param.getFlowModeId());

            // 设置新流程执行对象的流程名称
            newHandle.setFlowName(flowMode.getStateName());

            //  设置订单号
            newHandle.setOrderId(param.getOrderNum());
        } else {
            //  设置订单号
            newHandle.setOrderId(param.getOrderNum());
            // 如果没有传流程模板ID，证明这条业务线不是刚开始
            // 则找到该订单号下最新的一个流程执行
            QueryWrapper<FlowHandle> wrapper = new QueryWrapper<FlowHandle>()
                    .eq("order_id", param.getOrderNum())
                    .eq("now", 1);

            // 在已结束的流程中，ID最大的就是最新的流程
            FlowHandle oldHandle = flowHandleMapper.selectOne(wrapper);

            // 检查是否找到符合条件的流程执行(获取最新的流程执行)
            if (oldHandle!=null) {
                // 设置新流程执行对象的流程模板ID和流程名称与旧的流程执行一致
                newHandle.setFlowModeId(oldHandle.getFlowModeId());
                newHandle.setFlowName(oldHandle.getFlowName());
                newHandle.setOrderId(oldHandle.getOrderId());

                // 将旧的流程执行状态更新为已结束
                oldHandle.setNow(2);
                flowHandleMapper.updateById(oldHandle);
            } else {
                throw new RebornException("未找到已结束的流程执行",60001);
            }
        }

        // 设置负责人ID
        if (param.getHandler() != null&&param.getHandler() !=0) {
            newHandle.setHandler(param.getHandler());
        }
        FlowMode mode = flowModeMapper.selectOne(new QueryWrapper<FlowMode>().eq("state_code", param.getFlowCode()));
        if (mode==null){
            throw new RebornException("不存在的流程模型",70001);
        }
        // 设置流程码
        newHandle.setFlowCode(mode.getStateCode());

        //设置流程名称
        newHandle.setFlowName(mode.getStateName());

        // 设置新流程执行对象的状态为进行中
        newHandle.setNow(1);

        // 设置备注信息
        if (param.getMessage() != null) {
            newHandle.setMessage(param.getMessage());
        }

        // 插入新的流程执行对象到数据库
        flowHandleMapper.insert(newHandle);

        // 返回新创建的流程执行对象
        return newHandle;
    }

}
